JavaFXにおいて3Dモデルデータを取り込む機能は用意されていないが、3Dモデルデータのインポートライブラリ『JavaFX™ 3D Model Importers』が
InteractiveMesh.orgから公開されている。ライセンスはとても緩く設定されている(商用可能も可能。ただし、ライセンス表記などは必要)ため、利用可能な範囲も広いと思われる。
■ 取込可能な3Dモデルデータ
現時点(2015年10月12日)で、JavaFX™ 3D Model Importersにて取り込み可能なモデルデータは以下の通りである。
ファイル形式 |
拡張子 |
内容 |
Autodesk 3DS Max |
*.3ds |
CADソフトで有名なAutodeskで利用される拡張子 |
Collada |
*.dae
*.zae |
ソニー・コンピュータエンタテインメントがPlayStation 3とPlayStation Portable向けの開発用公式フォーマットとして策定 |
JavaFX 3D FXML Models |
*.fxml |
JavaFXの3DオブジェクトをFXMLファイルにエクスポートしたもの |
OBJファイル |
*.obj |
Advanced Visualizerというソフトの拡張子。数多くの3Dソフトが対応しているファイル形式 |
Standard Triangulated Language |
*.stl |
スリーディー・システムズの3Dソフトで利用される拡張子 |
X3D |
*.x3d *.x3dz |
ISOが定めたXMLベースの3次元コンピュータグラフィックスを表現するためのファイルフォーマット |
■ EclipseにおけるJavaFX™ 3D Model Importersライブラリの設定方法
InteractiveMesh.orgの『[download]』からライブラリをダウンロードし、適当な場所にファイルを解凍する。今回はプロジェクトフォルダ直下に作成したlibフォルダ以下に展開した。ライセンスに関するファイルなどが同梱されているので、利用の前には目を通しておく必要がある。
Eclipseで利用するには、プロジェクトのメニューの「プロジェクト - プロパティ - Javaのビルドパス - ライブラリー」にて、「外部Jarの追加」にて解凍したライブラリファイル(*.jarファイル)をすべて指定して「OK」ボタンを押す。
■ OBJファイルを取り込むサンプル
3D Model Importersを利用してJavaFXにOBJファイルを取り込むサンプルコードを以下に示す。サンプルでは3つのOBJファイルを読み込み出力する。
◇サンプルコード
package application_fx_functional;
import java.io.File;
import com.interactivemesh.jfx.importer.ImportException;
import com.interactivemesh.jfx.importer.obj.ObjModelImporter;
import javafx.application.Application;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.LightBase;
import javafx.scene.Node;
import javafx.scene.PerspectiveCamera;
import javafx.scene.PointLight;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class Test3DModelImport extends Application {
public static void main(String[] args)
{
launch( args );
}
/**
* 【シーングラフ構成】
* root
* ┣ Group(model1)
* ┃ ┣ メッシュ1
* ┃ ┣ …
* ┃ ┗ メッシュn
* ┣ Group(model2)
* ┃ ┣ メッシュ1
* ┃ ┣ …
* ┃ ┗ メッシュn
* ┗ Group(model3)
* ┣ メッシュ1
* ┣ …
* ┗ メッシュn
*/
@Override
public void start(Stage primaryStage) throws Exception
{
// シーングラフの構成
Group root = new Group();
// モデルデータの取り込み
for( int i = 1 ; i <= 3 ; i++ )
{
// モデル取込
String fileName = "3dmodel/Perfume_Global_Site_Project_003/model" + i +".obj";
String url = new File( fileName ).toURI().toString();
Node model = createModelFromObj( url );
// 3Dモデルを回転
model.setRotationAxis( new Point3D( 0.0 , 1.0 , 0.0 ) );
model.setRotate( 135.0 );
root.getChildren().add( model );
}
// シーンの作成
// 3Dシーンの奥行きを表現するため、Zバッファを有効にする
Scene scene = new Scene( root , 1000 , 750 , true );
scene.setFill( Color.BLACK );
// カメラ設定
PerspectiveCamera camera = new PerspectiveCamera( true );
camera.setFarClip( 3000 );
camera.setTranslateZ( -1500 );
scene.setCamera( camera );
// 光源設定
LightBase light = new PointLight();
light.setTranslateZ( -1500 );
root.getChildren().add( light );
// ウィンドウ表示
primaryStage.setScene( scene );
primaryStage.show();
}
/**
* URL指定でOBJファイルからメッシュを作成する
* @param url
* @return
*/
public Node createModelFromObj( String url )
{
// 戻り値の3Dモデルグループを作成
Group root = new Group();
// 3Dモデルのインポーターを作成
ObjModelImporter importer = new ObjModelImporter();
// インポータにモデル・ファイルを設定
try{
importer.read( url );
}catch( ImportException e ){
e.printStackTrace();
}
// 3Dモデルを取込
Node[] meshes = importer.getImport();
root.getChildren().addAll( meshes );
// インポータを閉じる
importer.close();
return root;
}
}
◇リソース
Perfume Grobal Siteにて配布していた3Dモデルファイル(model1~3.obj)を利用
◇フォルダ階層
プロジェクト
┣ src
┃ ┗ Test3DModelImport.java
┣ 3dmodel
┃ ┗ Perfume_Global_Site_Project_003
┃ ┣ model1.obj
┃ ┣ model2.obj
┃ ┗ model3.obj
┗ lib
┗ JFX3DModelImporters_EA_2014-02-09
┗ jimObjModelImporterJFX.jar
◇実行結果
◇解説
- 3Dモデルの取り込みはcreateModelFromObj関数で行っている(90行目~113行目)。関数内ではOBJファイルを取り込むObjModelImporterクラスを作成し、getImport関数によってJavaFXで出力可能なNode型データの配列として読み込んでいる(106行目)
- 取り込んだデータはシーングラフに登録することにより、画面出力される(59行目)
- 3Dモデルを出力する際にはZバッファを有効にしておかないと、前後関係がおかしな画像が出力されるため注意が必要である(65行目)
なお、インポータは各ファイル形式で異なるクラスを利用している。OBJファイルの取込はObjModelImporterクラス、daeファイルの取込はColModelImporterクラス等、適切なクラスを選択する必要がある。
■ 参照
- InteractiveMesh.org -> ライブラリの配布元サイト
- Perfume Grobal Site -> 3Dモデルを配布しているサイト